8066
19598
Résumé: Quelle est la référence définitive ou l'implémentation de référence pour l'ISA de niveau utilisateur RISC-V?
Contexte: Le site Web RISC-V a "Le manuel du jeu d'instructions RISC-V" qui explique très bien les instructions au niveau de l'utilisateur, mais ne donne pas de spécification exacte pour elles. J'essaie de créer un simulateur ISA de niveau utilisateur maintenant et j'ai l'intention d'écrire une implémentation FPGA plus tard, donc le comportement exact est important pour moi.
Une implémentation de référence serait suffisante, mais devrait de préférence être aussi simple que possible - c'est-à-dire que j'essaierais de comprendre une implémentation en pipeline uniquement en dernier recours. Ce qui est important, c'est d'avoir une compréhension de l'ISA spécifié et non d'une seule implémentation de processeur ou d'implémentation de compilateur.
Un exemple pour montrer mon problème est l'instruction AUIPC: L'explication en prose dit que "AUIPC forme un décalage de 32 bits à partir du U-immédiat de 20 bits, remplissant les 12 bits les plus bas avec des zéros, ajoute ce décalage au pc, puis place le résultat dans le registre rd. " Je voulais savoir s'il s'agissait de l'ancien ou du nouveau PC, c'est-à-dire la position de l'instruction AUIPC ou l'instruction suivante. J'ai regardé l'implémentation "RISCV Angel", mais cela semble masquer les bits inférieurs de (l'ancien) PC - pas seulement de l'immédiat - pour lesquels je ne pouvais trouver aucune raison dans les spécifications, même pas dans le modifier l'historique de la spécification (car Angel est un peu plus âgé). Au lieu d'une réponse, j'ai maintenant deux questions sur l'AUIPC. De nombreuses autres instructions me posent des problèmes similaires. 
AFAICT le manuel d'instructions RISC-V que vous citez est ce qui se rapproche le plus d'une référence définitive. S'il y a des choses qui ne sont pas claires ou incorrectes, vous pouvez ouvrir des problèmes sur le site Github où ce document est conservé: https://github.com/riscv/riscv-isa-manual
En ce qui concerne AIUPC, la réponse est implicite, mais pas explicitement énoncée, par cette phrase au bas de la page 9 du manuel actuel:
Il existe un registre supplémentaire visible par l'utilisateur: le compteur de programme pc contient l'adresse de l'instruction courante.
Sur la base de cette déclaration, je m'attendrais à ce que la valeur pc qui est vue et manipulée par l'instruction AIUPC soit l'adresse de l'instruction AIUPC elle-même.
Cette interprétation est soutenue par la discussion de l'instruction JALR:
L'instruction de saut indirect JALR (jump and link register) utilise le codage de type I. L'adresse cible est obtenue en ajoutant le I-immédiat signé de 12 bits au registre rs1, puis en mettant à zéro le bit le moins significatif du résultat. L'adresse de l'instruction suivant le saut (pc + 4) est écrite dans le registre rd.
Etant donné que l'adresse de l'instruction suivante est exprimée en pc + 4, il semble clair que la valeur pc visible lors de l'exécution de JALR est l'adresse de l'instruction JALR elle-même.
La dernière version du manuel (sur https://github.com/riscv/riscv-isa-manual/releases/download/draft-20190321-ba17106/riscv-spec.pdf) rend la situation légèrement plus claire. Au lieu de cela dans le manuel actuel:
AUIPC ajoute 12 bits zéro de poids faible au U-immédiat de 20 bits, étend le résultat à 64 bits, puis l'ajoute au pc et place le résultat dans le registre rd.
le dernier projet dit:
AUIPC forme un décalage de 32 bits à partir du U-immédiat de 20 bits, remplissant les 12 bits les plus bas avec des zéros, ajoute ce décalage au pc de l'instruction AUIPC, puis place le résultat dans le registre rd.
|
Ta Réponse
StackExchange.ifUsing ("éditeur", fonction () {
StackExchange.using ("externalEditor", function () {
StackExchange.using ("extraits", function () {
StackExchange.snippets.init ();
});
});
}, "extraits de code");
StackExchange.ready (fonction () {
var channelOptions = {
tags: "" .split (""),
id: "1"
};
initTagRenderer ("". split (""), "" .split (""), channelOptions);
StackExchange.using ("externalEditor", function () {
// Doit lancer l'éditeur après les extraits, si les extraits sont activés
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using ("extraits", function () {
createEditor ();
});
}
autre {
createEditor ();
}
});
function createEditor () {
StackExchange.prepareEditor ({
useStacksEditor: faux,
heartbeatType: 'réponse',
autoActivateHeartbeat: faux,
convertImagesToLinks: vrai,
noModals: vrai,
showLowRepImageUploadWarning: vrai,
reputationToPostImages: 10,
bindNavPrevention: vrai,
suffixe: "",
imageUploader: {
brandingHtml: "Powered by \ u003ca href = \" https: //imgur.com/ \ "\ u003e \ u003csvg class = \" svg-icon \ "width = \" 50 \ "height = \" 18 \ "viewBox = \ "0 0 50 18 \" fill = \ "none \" xmlns = \ "http: //www.w3.org/2000/svg \" \ u003e \ u003cpath d = \ "M46.1709 9.17788C46.1709 8.26454 46.2665 7.94324 47.1084 7.58816C47.4091 7.46349 47.7169 7.36433 48.0099 7.26993C48.9099 6.97997 49.672 6.73443 49.672 5.93063C49.672 5.22043 48.9832 4.61182 48.1414 4.61182C47.4335 4.61182 46.72554.9762.6943 4.61182C47.4335 4.61182 46.72554.91628 46.094 4.69.4335 4.61182 46.72554.91628 46.094.49.48.4335 4.61182 46.7256 4.9762.692 43.1481 6.59048V11.9512C43.1481 13.2535 43.6264 13.8962 44.6595 13.8962C45.6924 13.8962 46.1709 13.2535 46.1709 11.9512V9.17788Z \ "/ \ u003e \ u003cpath d = \" M32.492 10.1419C32.492 12.6954.0 34184.01448.0 14.6954.0 34184.0 34184.0 14.6954.0 34184.0 14484.0 14.6954.0 34184.0 14484.0 41.5985 12.6954 41.5985 10.1419V6.59049C41.5985 5.28821 41.1394 4.66232 40.1061 4.66232C39.0732 4.66232 38.5948 5.28821 38.5948 6.59049V9.60062C38.5948 10.8521 38.2696 11.5455 37.0451 11.4455.5C35.820 521 35.4954 9.60062V6.59049C35.4954 5.28821 35.0173 4.66232 34.0034 4.66232C32.9703 4.66232 32.492 5.28821 32.492 6.59049V10.1419Z \ "/ \ u003e \ u003cpath fill-rule = \" evenodd \ "clip-rule = \" evenodd \ "clip-rule = \" evenodd \ "d. = \ "M25.6622 17.6335C27.8049 17.6335 29.3739 16.9402 30.2537 15.6379C30.8468 14.7755 30.9615 13.5579 30.9615 11.9512V6.59049C30.9615 5.28821 30.4833 4.66231 29.4502 4.66231C28.993 15.6379C30.8468 14.7755 30.9615 13.5579 30.9615 11.9512V6.59049C30.9615 5.28821 30.4833 4.66231 29.4502 4.66231C28.993.509 4.66231 29.4502 4.66231C28.993.505 4.66231 29.4502 4.66231C28.993.505 4.66231 29.4502 4.66231C28.993.505 4.66231 29.4502 4.66231C28.993.505 4.66231 29.4502 4.66231C28.993.505 4.66231 29.4502 4.66231C28.993.505 4.66231 29.4502 4.66231C28.993.50C .1369 4.56087 21.0134 6.57349 21.0134 9.27932C21.0134 11.9852 23.003 13.913 25.3754 13.913C26.5612 13.913 27.4607 13.4902 28.1109 12.6616C28.1109 12.7229 28.1161 12.7799 28.121 12.8341.8308.28.1161 12.7799 28.121 12.8341.830C 12.7799 28.121 12.8341.830C 12.7799 28.137 12.8341.830C 28.1161 12.7799 28.121 12.8341.8302.4284.1256 12.7799 28.121 12.8341.285 12.8341.2256 12.7799 28.121 12.8341.224C 12.7799 28.121 12.8341.830C 12.7799 28.121 12.8341.250 15.2321 24.1352 14.9821 23.5661 14.7787C23.176 14.6393 22.8472 14.5218 22.5437 14.5218C21.7977 14.5218 21.2429 15.0123 21.2429 15.6887C21.2429 16.7375 22.9072 17.6393 22.8472 14.5218 22.5437 14.5218C21.7977 14.5218 21.2429 15.0123 21.2429 15.6887C21.2429 16.7375 22.9072 17.6335 25.6622 17.6335 7.0247 7.02417.6335 25.6622 17.6335 7.0247 7.02417.6335 25.6622 17.6335 7,02424 27.2119 7.09766 28.0918 7.94324 28.0918 9.27932C28.0918 10.6321 27.2311 11.511626.1024 11.5116C24.9737 11.5116 24.1317 10.6491 24.1317 9.27932Z \ "/ \ u003e \ u003cpath d = \" M16.8045 11.9512C16.8045 13.2535 17.2637 13.8962 18.2965 13.8962C19.3298 13.828V 19.802879 13.2566 16.4027 4.62866C15.1594 4.62866 14.279 4.98375 13.3609 5.88013C12.653 5.05154 11.6581 4.62866 10.3573 4.62866C9. 6,51203 13.8962C7. 9157 7,58817 6,91179 14,3365 15,4269 16,8045 7,58817 6,91179 6.91179C16.4027 16,8045 8.94108V11.9512Z \ "/ \ u003e \ u003cpath d = \" M3.31675 6.59049C3.31675 2,83866 4,66232 1,82471 5,28821 4.66232C0 0,791758 4,66232 5,28821 0,313354 0,313354 6.59049V11.9512C0.313354 13,2535 0,791758 13,8962 1,82471 13.8962C2.85798 13,8962 3,31675 13,2535 3,31675 11.9512V6.59049Z \ « / u003e \ u003.82012001. 1.98861C0 2.87869 0.822846 3.57676 1.87209 3.57676C2.90056 3.57676 3.7234 2.87869 3.7234 1.98861C3.7234 1.1159 2.90056 0.400291 1.87209 0.400291Z \ "fill = \" # 1BB76E \ "/ \ u003e \ u003c / s ,
contentPolicyHtml: "Contributions des utilisateurs sous licence \ u003ca href = \" https: //stackoverflow.com/help/licensing \ "\ u003ecc by-sa \ u003c / a \ u003e \ u003ca href = \" https://stackoverflow.com / legal / content-policy \ "\ u003e (politique de contenu) \ u003c / a \ u003e",
allowUrls: vrai
},
onDemand: vrai,
discardSelector: ".discard-answer"
, ImmediatelyShowMarkdownHelp: true, enableTables: true, enableSnippets: true
});
}
});
Merci d'avoir répondu à Stack Overflow!
S'il vous plaît assurez-vous de répondre à la question. Fournir des détails et partager vos recherches!
Mais évitez…
Demander de l'aide, des éclaircissements ou répondre à d'autres réponses.
Faire des déclarations basées sur des opinions; Soutenez-les avec des références ou une expérience personnelle.
Pour en savoir plus, consultez nos conseils sur la rédaction de bonnes réponses.
Brouillon enregistré
Brouillon rejeté
Inscrivez-vous ou connectez-vous
StackExchange.ready (fonction () {
StackExchange.helpers.onClickDraftSave ('# login-link');
});
Inscrivez-vous avec Google
Inscrivez-vous via Facebook
Inscrivez-vous par e-mail et mot de passe
Soumettre
Publier en tant qu'invité
Nom
Email
Obligatoire, mais jamais affiché
StackExchange.ready (
fonction () {
StackExchange.openid.initPostLogin ('. New-post-login', 'https% 3a% 2f% 2fstackoverflow.com% 2fquestions% 2f55314747% 2frisc-v-user-level-reference-or-reference-implementation% 23new-answer' , 'question_page');
}
);
Publier en tant qu'invité
Nom
Email
Obligatoire, mais jamais affiché
Publiez votre réponse
Jeter
En cliquant sur « postez votre réponse », vous acceptez nos conditions d'utilisation, politique de confidentialité et de la politique des cookies
Ce n'est pas la réponse que vous recherchez? Parcourez les autres questions marquées riscv ou posez votre propre question.